/**
 \file jeuSDL.h
 \brief Module permettant de jouer au demineur en mode Graphique
 \author Romain Montero, Yann M Yemvula
 \version 1.0
 \date 5/01/2012
 */


#ifndef JEUSDL_H
#define JEUSDL_H

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>

#include "grid.h"
/*! NB_IMAGES le nombre d'images utilisees*/
#define NB_IMAGES 12
/*!NB_SMILEYS le nombre de smileys utilises*/
#define NB_SMILEYS 3
/*! TAILLE_CASE la taille occupee par la case ou cellule*/
#define TAILLE_CASE 21 /* image 20x20 + 1 pour la séparation */
/*!TAILLE_SMILEY la taille occupee par le smiley*/
#define TAILLE_SMILEY 40 /* 40 x 40 */

/* Couleurs Smiley */
/*! JAUNE la couleur d 'une partie en cours*/
#define JAUNE 0
/*! VERT la couleur d'une partie gagnee*/
#define VERT 1
/*! ROUGE la couleur d'une partie perdue*/
#define ROUGE 2

/**
 	\struct SDLtexte
	\brief cree le texte en sdl
 */
typedef struct
{
	/*! ce champ indique la ligne du texte a afficher*/
	SDL_Surface *ligne;
	/*! ce champ indique la police du texte*/
	TTF_Font *police;
	/*! ce champ indique la couleur du texte a afficher*/
    	SDL_Color couleurPolice;
	/*! ce champ indique la position du texte dans la fenetre*/
    	SDL_Rect pos;
}SDLtexte;

/**
 	\struct SDLsmiley
	\brief cree le smiley en sdl
 */
typedef struct
{
	/*! ce champ indique le tableau contenant les differentes images du smiley a afficher*/
	SDL_Surface **images_smiley; /* tableau d'images */
	/*! ce champ indique la position du smiley dans la fenetre*/
	SDL_Rect pos;
}SDLsmiley;

/**
 	\struct SDLjeu
	\brief cree le jeu en sdl
 */
typedef struct
{
	/*! ce champ indique le pointeur sur le jeu*/
	Grille *grillejeu;
	/*! ce champ indique la fenetre du jeu*/
	SDL_Surface *ecran;
	/*! ce champ indique le tableau d'images a afficher*/
	SDL_Surface **images; /* tableau d'images */
	/*! ce champ indique le texte permettant d' afficher le nombre de cases restantes a decouvrir*/
	SDLtexte compteur;
	/*! ce champ indique le smiley de l'etat de la partie (gagnee, perdue, en cours)*/
	SDLsmiley smiley;
}SDLjeu;


/* Fonctions Jeu SDL */
/**
 *  	\fn int jeuSDL(SDLjeu *sjeu)
 *  	\brief 
	Fonction jeuSDL
     	cette fonction permet de faire tourner le jeu en mode graphique
 *  	\param [in,out] sjeu : pointeur sur le jeuSDL dans lequel on joue
 *  	\return entier utilise comme booleen pour savoir si l'utilisateur souhaite rejouer
 */
int jeuSDL(SDLjeu *sjeu);

/**
 *  	\fn int initSDL(SDLjeu *sjeu)
 *  	\brief 
	Procedure initSDL
	cette procedure ouvre la SDL, initialise le jeu (cree la fenetre, lui donne un nom...)
 *  	\param [in,out] sjeu : pointeur sur le jeuSDL a initialiser
 */
void initSDL(SDLjeu *sjeu);

/**
 *  	\fn initImagesSDL(SDLjeu *sjeu)
 *  	\brief
	Procedure initImagesSDL 
	cette procedure alloue le tableau d'images et les charge dans celui-ci
 *  	\param [in,out] sjeu : pointeur sur le jeuSDL a initialiser
 */
void initImagesSDL(SDLjeu *sjeu);

/**
 *  	\fn detruireSDL(SDLjeu *sjeu)
 *  	\brief 
	Procedure detruireSDL
	cette procedure libere la memoire occupee par le jeu et quitte la SDL
 *  	\param [in,out] sjeu : pointeur sur le jeuSDL a detruire
 */
void detruireSDL(SDLjeu *sjeu);

/**
 *  	\fn libererImagesSDL(SDLjeu *sjeu)
 *  	\brief 
	Procedure libererImagesSDL
	cette procedure libere les surfaces et le tableau d'images
 *  	\param [in,out] sjeu : le pointeur sur le jeuSDL a detruire
 */
void libererImagesSDL(SDLjeu *sjeu);

/**
 *  	\fn afficherGrilleSDL(SDLjeu *sjeu)
 *  	\brief 
	Procedure afficherGrille
	cette procedure affiche la grille du jeu
 *  	\param [in,out] sjeu : le pointeur sur le jeu a afficher
 */
void afficherGrilleSDL(SDLjeu *sjeu);

/**
 *  	\fn void trouverCaseSDL(const SDL_Event event, int *x, int *y)
 *  	\brief 
	Procedure trouverCaseSDL
	cette procedure cherche les coordonnees de la case lors d'un clic
 *  	\param [in] event : le clic du joueur
 *  	\param [in,out] x, y : les coordonnees de la case ou le joueur a clique
 */
void trouverCaseSDL(const SDL_Event event, int *x, int *y);



/* Fonctions Texte */
/**
 *  	\fn void initTexteSDL(SDLtexte *texte, const int dimy)
 *  	\brief 
	Procedure initTexteSDL
	cette procedure initialise le texte a afficher (ouverture de la police, reglage de la position, de la couleur)
 *  	\param [in,out] texte : la structure SDLtexte a initialiser
 *  	\param [in] dimy : la longueur de la grille
 */
void initTexteSDL(SDLtexte *texte, const int dimy);

/**
 *  	\fn void detruireTexteSDL(SDLtexte *texte)
 *  	\brief 
	Procedure detruireTexteSDL
	cette procedure ferme la police
 *  	\param [in,out] texte : la structure SDLtexte a detruire
 */
void detruireTexteSDL(SDLtexte *texte);

/**
 *  	\fn void afficherCasesRestantesSDL(SDLjeu *sjeu)
 *  	\brief 
	Procedure afficherCasesRestantesSDL
	cette procedure affiche le nombre de case restantes
 *  	\param [in,out] sjeu : le jeu ou il faut afficher le nombre de cases restantes
 */
void afficherCasesRestantesSDL(SDLjeu *sjeu);



/* Fonctions Smiley */
/**
 *  	\fn void initSmileySDL(SDLsmiley *smiley, const int dimx, const int dimy)
 *  	\brief 
	Procedure initSmiley
	cette procedure initialise le smiley a afficher (chargement des images, reglage de la position)
 *  	\param [in,out] smiley : la structure SDLsmiley a initialiser
 *  	\param [in] dimx, dimy : les dimensions de la grille
 */
void initSmileySDL(SDLsmiley *smiley, const int dimx, const int dimy);

/**
 *  \fn void detruireSmileySDL(SDLsmiley *smiley)
 *  \brief libere les images et le tableau
 *  \param [in,out] smiley : la structure SDLsmiley a detruire
 */
void detruireSmileySDL(SDLsmiley *smiley);

/**
 *  	\fn void afficherSmileySDL(SDLjeu *sjeu, const int i)
 *  	\brief 
	Procedure afficherSmiley
	cette procedure affiche le smiley
 *  	\param [in,out] sjeu : le jeu ou il faut afficher le smiley
 *  	\param [in] i : la position dans le tableau de la couleur du smiley
 */
void afficherSmileySDL(SDLjeu *sjeu, const int i);



/* Fonctions générales */
/**
 *  	\fn int pause(const SDLjeu *sjeu)
 *  	\brief 
	Procedure pause
	cette procedure fait une pause lorsque le joueur a termine la partie, attend qu'il ferme la fenetre ou clique sur le smiley pour rejouer
 *  	\param [in] sjeu : le pointeur sur le jeuSDL dans lequel on joue
 *  	\return l'entier utilise comme booleen pour savoir si l'utilisateur souhaite rejouer
 */
int pause(const SDLjeu *sjeu);

#endif
